package task

import (
	"errors"
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"strconv"
	"tupu-go/controller/task/task_req_res"
	"tupu-go/pkg/res"
	"tupu-go/service/task"
)

// TaskController
// Task控制器
type TaskController struct {
	service *task.TaskService // 假设service层已实现接口
}

func NewTaskController() *TaskController {
	return &TaskController{
		service: task.NewTaskService(), // 通过工厂函数获取接口实例
	}
}

// CreateTask 创建任务
func (tc *TaskController) CreateTask(c *gin.Context) {
	var req task_req_res.CreateTaskRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		res.ErrorResponse(c, http.StatusBadRequest, err)
		return
	}

	//// 调用业务层创建
	//task, err := tc.service.CreateTaskWithNodeTypes(c.Request.Context(), req.Task, req.NodeTypeIDs)
	//if err != nil {
	//	res.ErrorResponse(c, http.StatusInternalServerError, err)
	//	return
	//}

	//res.SuccessResponse(c, task)
}

// ListTasks 获取任务列表
func (tc *TaskController) ListTasks(c *gin.Context) {
	// 获取分页参数
	page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
	pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "10"))

	// 调用业务层查询
	tasks, total, err := tc.service.ListTasks(c.Request.Context(), page, pageSize)
	if err != nil {
		res.ErrorResponse(c, http.StatusInternalServerError, err)
		return
	}

	res.SuccessResponse(c, map[string]interface{}{
		"total": total,
		"list":  tasks,
	})
}

// GetTaskNodeTypes 获取任务关联的节点类型
func (tc *TaskController) GetTaskNodeTypes(c *gin.Context) {
	// 获取路径参数
	taskID := c.Param("task_id")
	if taskID == "" {
		res.ErrorResponse(c, http.StatusBadRequest, errors.New("任务ID不能为空"))
		return
	}

	// 调用业务层查询
	nodeTypes, err := tc.service.ListTaskNodeTypes(c.Request.Context(), taskID)
	if err != nil {

		res.ErrorResponse(c, http.StatusInternalServerError, err)

		return
	}

	res.SuccessResponse(c, nodeTypes)
}

// DeleteTask 删除任务
func (tc *TaskController) DeleteTask(c *gin.Context) {
	// 获取路径参数
	taskID := c.Param("task_id")
	if taskID == "" {
		res.ErrorResponse(c, http.StatusBadRequest, errors.New("任务ID不能为空"))
		return
	}

	// 调用业务层删除
	if err := tc.service.DeleteTask(c.Request.Context(), taskID); err != nil {

		res.ErrorResponse(c, http.StatusInternalServerError, err)

		return
	}

	res.SuccessResponse(c, nil)
}

// UpdateTask 部分更新任务基本信息（如名称、状态、描述）
func (tc *TaskController) UpdateTask(c *gin.Context) {
	taskID := c.Param("task_id")
	if taskID == "" {
		res.ErrorResponse(c, http.StatusBadRequest, errors.New("任务ID不能为空"))
		return
	}

	// 解析更新数据（JSON格式）
	var updateData map[string]interface{}
	if err := c.ShouldBindJSON(&updateData); err != nil {
		res.ErrorResponse(c, http.StatusBadRequest, fmt.Errorf("解析请求数据失败: %w", err))
		return
	}

	// 调用Service更新
	if err := tc.service.UpdateTask(c.Request.Context(), taskID, updateData); err != nil {
		if err.Error() == "任务不存在" {
			res.ErrorResponse(c, http.StatusNotFound, err)
		} else {
			res.ErrorResponse(c, http.StatusInternalServerError, err)
		}
		return
	}

	res.SuccessResponse(c, gin.H{"message": "任务更新成功"})
}

// UpdateTaskNodeTypes 更新任务关联的节点类型（会自动重新匹配边类型）
func (tc *TaskController) UpdateTaskNodeTypes(c *gin.Context) {
	taskID := c.Param("task_id")
	if taskID == "" {
		res.ErrorResponse(c, http.StatusBadRequest, errors.New("任务ID不能为空"))
		return
	}

	// 解析请求数据
	var req struct {
		NodeTypeIDs []int `json:"node_type_ids" binding:"required,min=1"` // 至少1个节点类型
	}
	if err := c.ShouldBindJSON(&req); err != nil {
		res.ErrorResponse(c, http.StatusBadRequest, fmt.Errorf("解析节点类型列表失败: %w", err))
		return
	}

	//// 调用Service更新节点类型关联
	//if err := tc.service.UpdateTaskNodeTypes(c.Request.Context(), taskID, req.NodeTypeIDs); err != nil {
	//	if err.Error() == "任务不存在" {
	//		res.ErrorResponse(c, http.StatusNotFound, err)
	//	} else if strings.Contains(err.Error(), "节点类型不存在") {
	//		res.ErrorResponse(c, http.StatusBadRequest, err)
	//	} else {
	//		res.ErrorResponse(c, http.StatusInternalServerError, err)
	//	}
	//	return
	//}

	res.SuccessResponse(c, gin.H{"message": "任务节点类型更新成功，已自动匹配边类型"})
}
